from django.shortcuts import render

# Create your views here.
from django.views import View
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection
from django.http import HttpResponse, JsonResponse
from ronglian_sms_sdk import SmsSDK


class ImageCodeView(View):
    def get(self, request, uuid):
        text, image_data = captcha.generate_captcha()

        redis_cli = get_redis_connection('code')
        redis_cli.setex(uuid, 300, text)
        a = redis_cli.get(uuid)
        print(a)
        return HttpResponse(image_data, content_type='image/jpeg')


class SmsCodeView(View):
    def get(self, request, mobile):
        # 1.接收参数
        query_params = request.GET
        # 2. 提取参数
        image_code = query_params.get('image_code')
        image_code_id = query_params.get('image_code_id')
        # 3. 验证参数
        if len(image_code) != 4:
            return JsonResponse({'code': 400, 'errmsg': '验证码错误'})

        # 4.验证码对比
        redis_cli = get_redis_connection('code')
        redis_text = redis_cli.get(image_code_id)

        # 如果验证码失效，返回已超时
        if redis_text is None:
            return JsonResponse({'code': 400, 'errmsg': '验证码宜已超时'})

        # 获取过redis的验证码之后，对其进行删除
        redis_cli.delete(image_code_id)

        # 从redis中获取的数据是二进制数据，先使用decode进行转码为字符串，再用lower来规范验证码，全部为小写
        if redis_text.decode().lower() != image_code.lower():
            return JsonResponse({'code': 400, 'errmsg': '验证码错误'})

        # 获取标记为的值
        flag = redis_cli.get('send_flag_%s' % mobile)
        # 如果flag为真，则标记位还未失效，提示频繁发送验证码
        if flag:
            return JsonResponse({'code': 400, 'errmsg': '频繁发送验证码'})

        # 5. 生成验证码
        from random import randint
        sms_code = '%6d' % randint(0, 999999)

        # 6.保存验证码
        # 创建一个管道，减少客户端和redis的访问次数，达到减少延迟访问的目的
        pipeline = redis_cli.pipeline()
        pipeline.setex(mobile, 300, sms_code)
        # 设置一个标记为，如果存在则提示频繁操作
        pipeline.setex('send_flag_%s' % mobile, 180, 1)
        # 执行管道
        pipeline.execute()
        # 7.发送验证短信
        # from utils.sms import send_message
        # send_message(mobile, sms_code, 5)

        from celery_meiduo.sms.tasks import celery_send_sms_code
        celery_send_sms_code(mobile,sms_code,5)
        # 8.返回响应
        return JsonResponse({'code': 0})

    # 接收参数
    # 提取数据
    # 验证参数
    # 对比数据
    # 生成验证码
    # 保存验证码
    # 发送验证码
    # 返回响应
